-- 导入 mqtt 模块

local mqtt = require("mqtt.mqtt")
local socket = require("socket") -- 导入socket库用于定时

Topic = {}
Msg = {}

function 订阅成功(主题)
	
	if 主题 == 1then
		print("公共广播主题成功")
	elseif	主题 == 2 then
		print("订阅指令主题成功")
	elseif	主题 == 3 then
		print("订阅任务主题成功")
	end
	
end

function mqinit(url , userName , pas , device)
	
	Topic.state = "state/"..userName.."/"..device
	Topic.date = "date/"..userName
	Topic.task = "task/"..userName.."/"..device
	Topic.action = "action/"..userName.."/"..device
	Topic.broadcast = "broadcast/"..userName ----局部公共广播主题
	Topic.qjbroadcast = "qjbroadcast/#" ----全局局部公共广播主题
	Msg.下线 = {
		devices = device ,
		msg = "离线"
	}
	
	Msg.上线 = {
		devices = device ,
		msg = "在线"
	}
	Msg.下线 = jsonLib.encode(Msg.下线)
	Msg.上线 = jsonLib.encode(Msg.上线)
	
	client = mqtt.client{
		uri = url , -- MQTT 服务器的 URI
		username = userName , -- MQTT 服务器的用户名
		Password = pas , -- MQTT 服务器的密码
		clean = true , -- 清除会话标识
		version = mqtt.v50 , -- 使用 MQTT 版本 5.0
		reconnect = true , -- 自动重新连接
		ID = userName..device ,
		will = {
			topic = Topic.state , --状态主题
			payload = Msg.下线 ,
			retain = true ,
			qos = 0
		}
	}
	
	-- 设置 MQTT 客户端的事件处理函数
	client:on{
		-- 当连接成功时的回调函数
		connect = function(connack)
			if connack.rc ~= 0 then
				print("连接到 MQTT 服务器失败:" , connack:reason_string() , connack)
				return
			end
			print("连接成功:" , connack) -- 成功连接
			
			-- 订阅测试主题，并在成功订阅后发布消息
			assert(client:subscribe{ topic = Topic.task , qos = 0 , callback = function(suback)
				print("任务主题订阅成功:")
				
				-- 发布测试消息
				print('发布上线消息,并使用保留消息')
				
				assert(client:publish{
					topic = Topic.state , -- 消息发布的主题
					payload = Msg.上线 , -- 消息内容
					qos = 0 , -- QoS 等级
					retain = false ,
					properties = {
						payload_format_indicator = 1 ,
						content_type = "text/plain" ,
					} ,
					user_properties = {
						hello = "world" ,
					} ,
				})
				local 返回 = client:subscribe{topic = Topic.action , qos = 0 , callback = 订阅成功(3)}
				local 返回 = client:subscribe{topic = Topic.broadcast , qos = 0 , callback = 订阅成功(1)}
				local 返回 = client:subscribe{topic = Topic.qjbroadcast , qos = 0 , callback = 订阅成功(1)}
				print(返回)
				
			end})
			
		end ,
		
		-- 当收到消息时的回调函数
		message = function(msg)
			
			assert(client:acknowledge(msg)) -- 确认消息已收到
			Msgs = jsonLib.decode(msg.payload)
			--_ENV["调试输出"](msg , true)
			---print("收到消息:" , msg)
			--print("收到指令为:" , msg.payload)
			
			--print(Msgs)
			
			if msg ~= nil then
				Msgs = jsonLib.decode(msg.payload)
				print(Msgs)
				local 中控指令 = Msgs
				if 中控指令["类型"] == "脚本控制" then
					_ENV["当前任务"] = 中控指令["当前任务"]
					
				elseif 中控指令["类型"] == "配置信息" then
					_ENV["匹对结果"] = "匹配成功"
					_ENV["配置信息"] = 中控指令
					_ENV["文件_保存记录"]("配置信息" , _ENV["配置信息"])
					print("配置信息" , _ENV["配置信息"])
				elseif 中控指令["类型"] == "差价买卖信息" then
					_ENV["差价买卖信息"] = 中控指令
					print("配置信息" , _ENV["差价买卖信息"])
				elseif 中控指令["类型"] == "获取角色数据状态" then
					
					功能_发送记录及状态()
					
				end
				
			end
			
			return msg
		end ,
		
		-- 当连接关闭时的回调函数
		close = function(conn )
			print("连接关闭，原因:" , reason , err , conn)
			print("尝试重新连接...")
			
			sleep(1000)
			--client:start_connecting()
		end ,
		-- 当出现错误时的回调函数
		
		-- 其他回调...
		
		error = function(err)
			
			print("MQTT 客户端错误:" , err)
			_ENV["当前任务"] = "重启mqqt"
			
		end ,
		
		-- 新增连接状态回调（部分库支持）
		--[===[reconnect = function(attempt)
		print(string.format("第 %d 次重连尝试..." , attempt))
		client:restart()
		end]===]
	}
	--[===[	error = function(err)
	print("MQTT 客户端错误:" , err)
	sleep(1000)
	exitScript()
	
	end ,
	}]===]
	
	print("开始运行事件循环")
	beginThread(mqtt.run_ioloop , client)
	
end

Mq = {}

Mq.SendMsg = function(device , type , msgs)
	local date = {
		devices = device ,
		msg = msgs ,
		msgtype = type
	}
	if _ENV["是否接入中控"] == "1" then
		
		return true
	end
	
	-- 检查client是否已初始化
	if not client then
		print("MQTT客户端未初始化，跳过消息发送")
		return false
	end
	
	print("开始发送消息")
	client:publish{
		topic = Topic.date , -- 消息发布的主题
		payload = jsonLib.encode(date) , -- 消息内容
		qos = 1 , -- QoS 等级
	}
end

Mq.SendMsg个人汇总发送 = function(device , type , 发送名字等级 , 发送钻石 , 发送金币 , 发送战伤防命攻包 , 发送大小区 , 发送职业
	, 发送制造等级百分比 , 发送版本号 , 发送第几角色)
	if _ENV["是否接入中控"] == "1" then
		
		return true
	end
	local date = {
		devices = device ,
		["6"] = 发送名字等级 ,
		["10"] = 发送钻石 ,
		["11"] = 发送金币 ,
		["9"] = 发送战伤防命攻包 ,
		["5"] = 发送大小区 ,
		["7"] = 发送职业 ,
		["13"] = 发送制造等级百分比 ,
		["17"] = 发送版本号 ,
		["第几角色"] = 发送第几角色 ,
		msgtype = type
	}
	print(date)
	client:publish{
		topic = Topic.date , -- 消息发布的主题
		
		payload = jsonLib.encode(date) , -- 消息内容
		qos = 0 , -- QoS 等级
	}
end
Mq.SendMsg扩展消息 = function(device , type , 烟水晶 , 莎草纸
	)
	if _ENV["是否接入中控"] == "1" then
		
		return true
	end
	local date = {
		devices = device ,
		["扩展消息"] = "1" ,
		["8"] = 烟水晶 ,
		["9"] = 莎草纸 ,
		msgtype = type
	}
	print(date)
	client:publish{
		topic = Topic.date , -- 消息发布的主题
		
		payload = jsonLib.encode(date) , -- 消息内容
		qos = 0 , -- QoS 等级
	}
end
--print("创建了 MQTT v5.0 客户端:", client)
